<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>15.使用call或apply借用原型链</title>
</head>

<body>
  <script>
    //使用 call 或 apply 可以借用其他原型方法完成功能。
    //下面的 xj 对象不能使用max方法，但可以借用 hd 对象的原型方法
    let hd = {
      data: [1, 2, 3, 4, 5]
    };
    Object.setPrototypeOf(hd, {
      max: function () {
        // console.log(this.data);
        return this.data.sort((a, b) => b - a)[0];
      }
    });
    console.log(hd.max());
    let xj = {
      lessons: { js: 87, php: 63, node: 99 },
      // 不包含 data 属性，借用 Object。protoperty的时候会报错
      get data () {
        return Object.values(this.lessons);
      }
    }
    // 使用apply 方法将hd.property的this指向xj 对象
    console.log(hd.__proto__.max.apply(xj));



    //上例中如果方法可以传参，那就可以不在 xj 对象中定义 getter 方法了
    Object.setPrototypeOf(hd, {
      max: function (data) {
        return data.sort((a, b) => b - a)[0];
      }
    });
    xj = {
      lessons: { js: 100, php: 78, node: 78, linux: 125 }
    };

    console.log(typeof Object.values(xj.lessons));// object
    //- apply 用数组传参
    //- call 需要分别传参
    //console.log(hd.__proto__.max.call(xj, Object.values(xj.lessons)));
    //如果使用 apply传参数，需要以数组形式接收， max: function (data) 接收参数的形参要改为展开语法...data，以便接收数组
   // console.log(hd.__proto__.max.apply(xj, Object.values(xj.lessons)));

  </script>
</body>

</html>